<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>00_变量相关问题</title>
</head>
<body>
  <script>
    /* 
    变量是什么?
      可以变化的量(数据/值), 由变量名与变量值组成, 变量名是变量值的标识
      一个变量就是一块小内存, 变量名是内存的标识, 变量值是内存中的数据
    区别基本类型变量与引用类型变量?
      内存中保存的数据不一样
      基本变量: 内存中保存的是基本类型数据(boolean/string/number/null/undefined)
      引用变量: 内存中保存的是地址值
    给变量赋值到底做了什么?
      将基本值赋值给变量: 将数据值保存到变量内存中
      将对象赋值给变量: 将对象内存的地址值保存到变量内存中
      将右边的变量赋值给左边的变量: 将右边变量内存中的值拷贝保存左边变量内存中
          只是右边变量内存中的值, 可能是基本类型值, 也可能是地址值
    函数传参是值传递还是引用传递?
      总是将实参变量内存中的值拷贝保存到形参变量内存中, 只是这个形参变量内存中的值, 可能是基本值,也可能是地址值
      说是值传递 => 因为传递的都实参变量内存中的值
      说有可能是值传递, 也可能是引用传递 => 最终传递可能是基本值, 也可能是地址值(也称引用)
    有哪些改变变量值的方式?
      重新赋值   ==> 只有这一种, 下面的不是
      c.m = 2  => 没有改变c本身的值, 改的是c指向的对象中的m属性的值
    理解下面的2句话
      1. 多个引用变量指向同一个对象, 通过其中一个变量改变对象内部数据 => 其它变量也能看到原对象中的新数据
      2. 多个引用变量指向同一个对象, 让其中一个变量指向新的对象 => 其它变量看到的还是原对象的原数据
    */

   /*  var a = 3
    console.log(a)
    var b = {}   // b中保存了一个地址值  b的内存本身也是有地址值, 只是不用
    var c = b  // 不是将b内存的地址值赋值给c, 而是将b内存中保存的地址值赋值给c
    c = a

    function fn(x) {
      
    }
    fn(a)  // x = a
    fn(b) // x = b

    var a1 = 3
    a1 = {m: 1}
    c.m = 2 // 有没有改变c的值? 
    */

    // 1. 多个引用变量指向同一个对象, 通过其中一个变量改变对象内部数据 
    // => 其它变量也能看到原对象中的新数据
    var o1 = {m: 1}
    var o2 = o1
    o2.m = 2
    console.log(o1.m) // 2

    //  2. 多个引用变量指向同一个对象, 让其中一个变量指向新的对象 
    // => 其它变量看到的还是原对象的原数据
    var o3 = {m: 3}
    var o4 = o3
    o3 = {m: 4}
    console.log(o3.m, o4.m) // 4 3


    var a = {m: 1}
    var b = a
    function fn(a) {
      // a = {m: 2}
      a.m = 3
    }
    fn(a)
    console.log(a.m, b.m) 

  </script>
</body>
</html>